\chapter{字符串与文本}\label{ch17}

\emph{The string is a stark data structure and everywhere it is passed there is much duplication of process. It is a perfect vehicle for hiding information.}
\begin{flushright}
    ——Alan Perlis, epigram \#34
\end{flushright}

我们已经使用过了Rust中的主要文本类型：\texttt{String}、\texttt{str}和\texttt{char}。在\nameref{string}中，我们介绍了字符和字符串字面量的语法并且展示了字符串在内存中如何表示。在本章中，我们将更加详细地介绍文本。

在本章中：
\begin{enumerate}
    \item 我们会提供一些Unicode的背景知识，帮助你更好地理解标准库的设计。
    \item 我们会介绍\texttt{char}类型，它表示单个Unicode码点。
    \item 我们会介绍\texttt{String}和\texttt{str}类型，它们表示有所有权的和借用的Unicode字符序列。它们有非常多的方法用于构建、搜索、修改、迭代它们的内容。
    \item 我们会介绍Rust的字符串格式化设施，例如\texttt{println!}和\texttt{format!}宏。你可以编写自己的用于字符串格式化的宏，以及扩展它们来支持你自定义的类型。
    \item 我们会给出Rust中正则表达式支持的一个概述。
    \item 最后我们会讨论为什么Unicode规范化很重要，并展示如何在Rust中实现它。
\end{enumerate}

\section{Unicode背景知识}

本书是关于Rust的，而不是关于Unicode的，事实上已经有整本专门介绍它的书了。但Rust的字符和字符串类型被设计为Unicode。这里有一些有助于理解Rust的Unicode知识。

\subsection{ASCII, Latin-1, Unicode}
在所有ASCII码点范围（\texttt{0}到\texttt{0x7f}）内Unicode和ASCII完全相同：例如，这两种编码中字符\texttt{*}都是码点\texttt{42}。

\subsection{UTF-8}\label{utf8}

\section{字符(\texttt{char})}

\section{\texttt{String}和\texttt{str}}

\subsection{创建\texttt{String}值}

\subsection{简单的视图}

\subsection{附加和插入文本}\label{AppendText}

\section{格式化}\label{format}

\section{正则表达式}

\subsection{基本正则使用}

\subsection{惰性构建正则值}\label{LazyRegex}
